package com.anli.redisSuo;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.script.DefaultRedisScript;

import java.util.Collections;

/**
 * @author: LCG
 * 作者: LCG
 * 日期: 2021/3/8  14:01
 * 描述:
 */
public class MyRedisLock {



    /**
     * 作者: LCG
     * 日期: 2021/3/8  14:11
     * 描述: 获取锁的操作
     * @Param [key  锁的key, clientId 操作的客户端, expire 过期时间]
     * @Return boolean   lua的条件判断语法 if 条件 then  elseif 条件 then  else  end
     */
    public static boolean lock(String key, String clientId, long expire, RedisTemplate<String,Object> redisTemplate){

        String getLock="if redis.call('setNx',KEYS[1],ARGV[1]) == 1 then redis.call('expire',KEYS[1],ARGV[2]) return 1 else return 0 end";
        DefaultRedisScript<Long> defaultRedisScript=new DefaultRedisScript<>();
        defaultRedisScript.setResultType(Long.class);
        defaultRedisScript.setScriptText(getLock);
        Long execute = redisTemplate.execute(defaultRedisScript, Collections.singletonList(key), clientId, expire);
        if(execute==1){
           return true;
        }else{
            return false;
        }
    }


    /**
     * 作者: LCG
     * 日期: 2021/3/8  14:19
     * 描述: 释放锁
     * @Param []
     * @Return void
     */
    public static void unLock(String key,String clientId,RedisTemplate<String,Object> redisTemplate){

        String unLock="if redis.call('get',KEYS[1]) == ARGV[1] then redis.call('del',KEYS[1]) else end";
        DefaultRedisScript<Long> defaultRedisScript=new DefaultRedisScript<>();
        defaultRedisScript.setResultType(Long.class);
        defaultRedisScript.setScriptText(unLock);
        redisTemplate.execute(defaultRedisScript, Collections.singletonList(key), clientId);


    }

}
